package com.taotao.portal.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.CookieUtils;
import com.taotao.common.utils.HttpClientUtil;
import com.taotao.common.utils.JsonUtils;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbUser;
import com.taotao.portal.dao.JedisClient;
import com.taotao.portal.pojo.CartItem;
import com.taotao.portal.service.CartService;

/**
 * 
 * @ClassName: CartServiceImpl
 * @Description: 购物车服务层
 * @author 孙耀斌
 * @date 2018年6月13日 下午3:33:53
 *
 */
@Service
public class CartServiceImpl implements CartService {
	
	@Value("${REST_BASE_URL}")
	private String REST_BASE_URL;
	@Value("${ITEM_INFO_URL}")
	private String ITEM_INFO_URL;
	
	 @Autowired
    private JedisClient jedisClient;
    @Value("${SSO_BASE_URL}")
    private String SSO_BASE_URL; // localhost:8084
    @Value("${SSO_USER_TOKEN}")
    private String SSO_USER_TOKEN; // /user/token/
    @Value("${REDIS_CART_KEY}")
    private String REDIS_CART_KEY; // redis中购物车key
	/**
	 * 添加购物车商品
	 */
	@Override
	public TaotaoResult addCartItem(long itemId, int num, HttpServletRequest request, HttpServletResponse response) {
		// 取商品信息
		CartItem cartItem = null;
		// 取购物车商品列表
		List<CartItem> itemList = getCartListByRedis(request);
		// 判断购物车商品列表中是否存在此商品
		for (CartItem cItem : itemList) {
			// 如果存在此商品
			if (cItem.getId() == itemId) {
				// 增加商品数量
				cItem.setNum(cItem.getNum() + num);
				cartItem = cItem;
				break;
			}
		}
		if (cartItem == null) {
			cartItem = new CartItem();
			// 根据商品id查询商品基本信息。
			String json = HttpClientUtil.doGet(REST_BASE_URL + ITEM_INFO_URL + itemId);
			// 把json转化成java对象
			TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, TbItem.class);
			if (taotaoResult.getStatus() == 200) {
				TbItem item = (TbItem) taotaoResult.getData();
				cartItem.setId(item.getId());
				cartItem.setTitle(item.getTitle());
				cartItem.setImage(item.getImage() == null ? "" : item.getImage().split(",")[0]);
				cartItem.setNum(num);
				cartItem.setPrice(item.getPrice());
			}
			// 添加到购物车列表
			itemList.add(cartItem);
		} // 把购物车列表写入cookie
		/*CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(itemList), true);*/
		 String token = CookieUtils.getCookieValue(request, "TT_TOKEN");

        String json1 = HttpClientUtil.doGet(SSO_BASE_URL + SSO_USER_TOKEN + token);
        // 把json转换成TaotaoREsult
        TaotaoResult result = TaotaoResult.formatToPojo(json1, TbUser.class);
        if (result.getStatus() == 200) {
            TbUser user = (TbUser) result.getData();
            String name = user.getUsername();
            try {
                // 把商品信息写入缓存
                jedisClient.set(REDIS_CART_KEY + ":" + name + ":base", JsonUtils.objectToJson(itemList));
            } catch (Exception e) {
                e.printStackTrace();
            }
	      }
		return TaotaoResult.ok();
	}

	/**
	 * 从cookie中取商品列表
	 * <p>
	 * Title: getCartItemList
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @return
	 */
	private List<CartItem> getCartItemList(HttpServletRequest request) {
		// 从cookie中取商品列表
		String cartJson = CookieUtils.getCookieValue(request, "TT_CART", true);
		if (cartJson == null) {
			return new ArrayList<>();
		}
		// 把json转换成商品列表
		try {
			List<CartItem> list = JsonUtils.jsonToList(cartJson, CartItem.class);
			return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ArrayList<>();
	}
	/**
	 * 从cookie中把购物车列表取出来
	 * <p>
	 * Title: deleteCartItem
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param itemId
	 * @return
	 * @see com.taotao.portal.service.CartService#deleteCartItem(long)
	 */
	@Override
	public List<CartItem> getCartItemList(HttpServletRequest request, HttpServletResponse response) {
		 List<CartItem> itemList = null;
	        itemList = getCartListByRedis(request);
	        if (itemList.size() > 0) {
	            return itemList;
	        }
	        // -----------------------------------------------------------------------------

	        // itemList = getCartItemList(request); //从cookie中获取购物车列表
	        return itemList;
	}

	/**
	 * 删除购物车商品
	 * <p>
	 * Title: deleteCartItem
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 * 
	 * @param itemId
	 * @return
	 * @see com.taotao.portal.service.CartService#deleteCartItem(long)
	 */
	@Override
	public TaotaoResult deleteCartItem(long itemId, HttpServletRequest request, HttpServletResponse response) {
		// 从cookie中取购物车商品列表
		List<CartItem> itemList = getCartItemList(request);
		// 从列表中找到此商品
		for (CartItem cartItem : itemList) {
			if (cartItem.getId() == itemId) {
				itemList.remove(cartItem);
				break;
			}

		}
		// 把购物车列表重新写入cookie
		CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(itemList), true);

		return TaotaoResult.ok();
	}
	/*
     * 未登录状态下更新商品数量
     */
	@Override
	public TaotaoResult updateCartNum(long itemId, Integer num, HttpServletRequest request,
			HttpServletResponse response) {
		   //获取购物车列表
    	List<CartItem> itemList = getCartItemList(request);
        //取所选择的需要更新的商品
    	// 从列表中找到此商品
		for (CartItem cartItem : itemList) {
			if (cartItem.getId() == itemId) {
				cartItem.setNum(num);
				break;
			}
        }
     // 把购物车列表重新写入cookie
     		CookieUtils.setCookie(request, response, "TT_CART", JsonUtils.objectToJson(itemList), true);
        return TaotaoResult.ok();
	}

	/**
     * 从Redis中获取购物车列表
     * 
     * @param request
     * @return
     */
    private List<CartItem> getCartListByRedis(HttpServletRequest request) {
        // redis查询-------------------------------------------------------------------------
        /**
         * 跨域请求获取用户信息
         */
        String token = CookieUtils.getCookieValue(request, "TT_TOKEN");
       //根据token的值取用户的信息
        String json1 = HttpClientUtil.doGet(SSO_BASE_URL + SSO_USER_TOKEN + token);
        // 把json转换成TaotaoREsult
        TaotaoResult result = TaotaoResult.formatToPojo(json1, TbUser.class);
        if (result.getStatus() == 200) {
            TbUser user = (TbUser) result.getData();
            String name = user.getUsername();

            // 从缓存中取商品信息，商品id对应的信息
            String json = jedisClient.get(REDIS_CART_KEY + ":" + name + ":base");
            // 判断是否有值
            if (json == null) {
                return new ArrayList<>();
            } else {
                List<CartItem> list = JsonUtils.jsonToList(json, CartItem.class);
                return list;
            }

        }
        return new ArrayList<>();
    }
}
